package net.esj.basic.core.engine.util.enumeration;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import net.esj.basic.core.engine.provider.AbstractProvidersFactory;
import net.esj.basic.pojo.EnumStructure;
import net.esj.basic.utils.CollectionUtils;

public final class EnumProvidersFactory extends AbstractProvidersFactory<EnumProvider>{

	//private EnumProvider[] managers;
	
	public List<EnumStructure> findEnum(String key) {
		List<EnumStructure> ret = Collections.EMPTY_LIST;
		for(EnumProvider manager : listProviders()){
			ret = manager.findEnum(key);
			if(!CollectionUtils.isEmpty(ret)){
				break;
			}
		}
		return ret;
	}

	public List<EnumVo> findEnumVo(String key) {
		List<EnumVo> ret = Collections.EMPTY_LIST;
		for(EnumProvider manager : listProviders()){
			ret = manager.findEnumVo(key);
			if(!CollectionUtils.isEmpty(ret)){
				break;
			}
		}
		return ret;
	}

	public EnumStructure getEnum(String key, String code) {
		EnumStructure ret = null;
		for(EnumProvider manager : listProviders()){
			ret = manager.getEnum(key,code);
			if(ret!=null){
				break;
			}
		}
		return ret;
	}

	public EnumVo getEnumVo(String key, String code) {
		EnumVo ret = null;
		for(EnumProvider manager : listProviders()){
			ret = manager.getEnumVo(key,code);
			if(ret!=null){
				break;
			}
		}
		return ret;
	}

	/*public void setManagers(EnumProvider[] managers) {
		this.managers = managers;
	}*/

	public static final EnumVo convertToEnumVo(EnumStructure str){
		EnumVo vo = new EnumVo();
		vo.setId(str.getId());
		vo.setEnumCode(str.getEnumCode());
		vo.setEnumOrdinal(str.getEnumOrdinal());
		vo.setEnumTitle(str.getEnumTitle());
		vo.setEnumType(str.getEnumType());
		vo.setEnumValue(str.getEnumValue());
		return vo;
	}
	
	public static final <T extends EnumStructure> List<EnumVo> convertToEnumVo(List<T> strs){
		List<EnumVo> list = new ArrayList<EnumVo>();
		for(EnumStructure str : strs){
			list.add(convertToEnumVo(str));
		}
		return list;
	}

	@Override
	protected Class getProviderClass() {
		return EnumProvider.class;
	}

	static EnumProvider proxy;
	
	@Override
	protected void provideProxy(EnumProvider proxy) {
		this.proxy = proxy;
	}
	
}
